import ipaddress
import logging

def get_logger(logger_name, file_name = 'server.log'):
    """获取日志对象, 默认级别为DEBUG
    
    Args:
        logger_name (str, optional): 日志对象名称.
        file_name (str, optional): 日志文件名. Defaults to server.log.
    Returns:
        logger: 日志对象
    """
    logger = logging.getLogger(logger_name)
    logger.setLevel(logging.DEBUG)
    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    logger.propagate = False

    handler = logging.StreamHandler()
    handler.setLevel(logging.DEBUG)
    handler.setFormatter(formatter)
    logger.addHandler(handler)

    handler = logging.FileHandler(file_name)
    handler.setLevel(logging.DEBUG)
    handler.setFormatter(formatter)
    logger.addHandler(handler)
    return logger

# TODO 加密
# 根据规则检测IP是否符合
def is_ip_compliant(ip, config):
    """
    判断给定的 IP 地址是否符合配置中的规则。
    
    :param ip: 要检查的 IP 地址（字符串形式）
    :param config: 配置列表，包含 IP 地址或子网（字符串形式）
    :return: 如果 IP 地址符合配置中的规则，返回 True；否则返回 False
    """
    try:
        # 将给定的 IP 地址转换为 ipaddress.IPv4Address 或 ipaddress.IPv6Address 对象
        ip_obj = ipaddress.ip_address(ip)
    except ValueError:
        # 如果给定的 IP 地址无效，返回 False
        return False

    # 遍历配置中的每个规则
    for rule in config:
        try:
            # 尝试将规则解析为子网
            network = ipaddress.ip_network(rule, strict=False)
            # 检查给定的 IP 地址是否在该子网内
            if ip_obj in network:
                return True
        except ValueError:
            # 如果规则是一个单独的 IP 地址
            try:
                rule_ip = ipaddress.ip_address(rule)
                # 检查给定的 IP 地址是否与规则中的 IP 地址相同
                if ip_obj == rule_ip:
                    return True
            except ValueError:
                # 如果规则无效，跳过该规则
                continue

    # 如果没有匹配的规则，返回 False
    return False

def get_config(path: str):
    # TODO
    return {
        'allowable_ip': ['10.237.128.0/24', '0.0.0.0', '127.0.0.1']
    }

logger = get_logger('OC-cluster', 'OC_cluster.log')